package czStvDpds.graphics3D;

import czStvDpds.mapmanagment.AccesibleMap;
import czStvDpds.movement.AbstractPlayer;
import java.util.ArrayList;
import org.lwjgl.util.vector.Vector3f;

/**
 *
 * @author divad
 */
public interface Drawing {
//    implementuje ho hlavní třída grafiky

    public static final int SCENE_GAME = 1, SCENE_MENU = 2;

    /**
     * předá mapu graficeů
     *
     * @param map
     */
    public void setMapData(AccesibleMap map);

    /**
     * předá malou část mapy grafice
     *
     * @param ??
     */
    public void mapChange(/*
             * MapPart mapPart
             */);

    /**
     * přidá nového hráče do seznamu hráčů grafiky
     *
     * @param p
     */
    public void addPlayer(GraphicalPlayer p);

    /**
     * odebre hráče ze seznamu hráčů grafiky
     *
     * @param p
     */
    public void removePlayer(GraphicalPlayer p);

    /**
     * oznámí grafice, zda se konkrétní hráč pohunl (změna pozice nebo rotace)
     *
     * @param p
     */
    public void playerMove(GraphicalPlayer p);

    /**
     * nastaví, co bude okno zobrazovat (hru, menu, nastavení, ...)
     *
     * @param state
     */
    public void setWindowState(int state);

    /**
     * vrací pole hráčů předaných grafice
     *
     * @return
     */
    public ArrayList<GraphicalPlayer> getPlayers();

    /**
     * vraccí mapu předanou grafice
     *
     * @return
     */
    public AccesibleMap getMap();

    /**
     * Nastaví, zda bude kurzor uvnitř okna vidět
     *
     * @param hide
     */
    public void setCursorHidden(boolean hide);

    /**
     * Vrací, zda je kurzor viditelný
     *
     * @return
     */
    public boolean isCursorHidden();

    /**
     * Nastaví kameru do pohledu první osoby určitého hráče.
     *
     * @param player Pokud je null, kamera se naství na free look.
     */
    public void locateCameraToPlayer(AbstractPlayer player, float collisionDiameter);

    /**
     * Vrátí hráče na kterého je centrovaná kamera
     *
     * @return
     */
    public AbstractPlayer getPlayerWithCamera();

    /**
     * Nsatví, zda se bude kamera smět volně pohybovat. Pokud je false, kamera
     * se nastí do defaultní pozice.
     *
     * @param freeCam
     */
    public void freeCamera(boolean freeCam);

    /**
     * Vrátí, zda je kamera nastavena na free look.
     *
     * @return
     */
    public boolean isCameraFree();

    /**
     * Vrátí aktuální scénu.
     *
     * @return
     */
    public Scene getActualScene();

    /**
     * Vrátí vybranou scénu.
     *
     * @param scene Drawing.SCENE_?
     * @return
     */
    public Scene getScene(int scene);

    /**
     * Zapne/vypne lokální ovládání kamery.
     */
//    public void toggleLIA();
    /**
     * Pohne kamerou o 1*value ve směru určeném hodnotami yaw a pitch.
     *
     * @param value
     */
    public void moveCamera(float value);

    /**
     * Přičte hodnoty x a y k yaw a pitch.
     *
     * @param x
     * @param y
     */
    public void rotateCamera(float x, float y);

    /**
     * Vrátí natočení kamery po ose y proti směru hodinových ručiček
     *
     * @return
     */
    public double getYaw();

    /**
     * Vrátí natočení kamery po ose x proti směru hodinových ručiček
     *
     * @return
     */
    public double getPitch();

    /**
     * Vrátí absolutní pozici kamery.
     *
     * @return
     */
    public Vector3f getCameraPosition();

    /**
     * Vrátí true pokud už bylo okno zavřeno.
     *
     * @return
     */
    public boolean isWindowClosed();

    /**
     * Předá posluchač ukončení grafiky.
     *
     * @param gep
     */
    public void addGraphicsEndProcessor(GraphicsEndProcessor gep);

    /**
     * Vrací předané posluchače ukončení grafiky.
     *
     * @return
     */
    public ArrayList<GraphicsEndProcessor> getGraphicsEndProcessors();

    /**
     * Odebere posluchač grafiky.
     *
     * @param gep
     */
    public void removeGraphicsEndProcessor(GraphicsEndProcessor gep);

    /**
     * Vrátí konkrétní scénu obsahující GUI
     *
     * @param sceneName
     * @return
     */
    public Scene getGUIScene(int sceneName);

    /**
     * Nastaví, zda bude konkrétní scéna s GUI vidět. Viditelnost ale také
     * zavísí na konkrétním módu grafiky - např. pokud bude zapnutý mód hry, gui
     * menu se nezobrazí.
     *
     * @param sceneName
     * @param visibility
     */
    public void setGUISceneVisibility(int sceneName, boolean visibility);

    /**
     * Vrátí true, pokud je scéna aktivovaná.
     *
     * @param sceneName
     * @return
     */
    public boolean getGUISceneVisibility(int sceneName);

    /**
     * přidá novou střelu do seznamu střel grafiky
     *
     * @param p
     */
    public void addBulet(GraphicalBullet b);

    /**
     * odebre střelu ze seznamu střel grafiky
     *
     * @param p
     */
    public void removeBullet(GraphicalBullet b);
    /**
     * oznámí grafice, zda se konkrétní hráč pohunl (změna pozice nebo rotace)
     *
     * @param p
     */
}
